package com.aaa.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

/**
 * DAO的工具类
 * 
 * @author Administrator
 *
 */
public class DAOUtil {

	private static DataSource source = null;

	/**
	 * A 创建数据库连接池 因为连接池 也是只需要创建一次即可
	 */
	static {

		try {
			// 创建一个 Property 对象 读取配置文件信息
			Properties p = new Properties();
			// 加载配置文件信息 inStream
			p.load(DAOUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
			// DataSource source 这就是Druid框架帮我们创建的数据库连接池 此时参数为 配置文件对象
			source = DruidDataSourceFactory.createDataSource(p);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * B 获取连接对象函数
	 */
	public static Connection getConnection() {
		try {
			// source 连接池 source.getConnection(); 从连接池中获取连接对象 并返回
			return source.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 增删改的通用函数
	 */
	public static int executeUpdate(String sql, Object... data) {
		Connection conn = null;
		try {
			conn = DAOUtil.getConnection();
			PreparedStatement ps = conn.prepareStatement(sql);
			for (int i = 0; i < data.length; i++) {
				ps.setObject(i + 1, data[i]);
			}
			int i = ps.executeUpdate();
			return i;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn);
		}
		return 0;
	}

	/**
	 * 查询的通用函数
	 */
	public static List<Map<String, Object>> executeQuery(String sql, Object... data) {
		Connection conn = null;
		try {
			conn = DAOUtil.getConnection();
			PreparedStatement ps = conn.prepareStatement(sql);
			for (int i = 0; i < data.length; i++) {
				ps.setObject(i + 1, data[i]);
			}
			ResultSet set = ps.executeQuery();

			List<Map<String, Object>> list = new ArrayList<>();
			int count = set.getMetaData().getColumnCount();

			while (set.next()) {
				Map<String, Object> map = new HashMap<>();
				for (int i = 1; i <= count; i++) {
					map.put(set.getMetaData().getColumnLabel(i), set.getObject(i));
				}
				list.add(map);
			}

			return list;

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn);
		}

		return null;

	}

	public static void close(Connection conn) {
		try {
			if (conn != null) {
				// 现在这个Conn 是从数据库连接池中取出来的连接对象
				// druid重写了其 close方法 不在是关闭资源 而是将conn返回到连接池
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
